--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / appcontainer_sandbox.py
Displaying Raw • Download
meshchatx/src/backend/appcontainer_sandbox.py 4bd787ccd70a459a02eececca3f942f0e64ec4ce (4bd787cc) Text, 30.74 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Optional Windows AppContainer / LPAC filesystem sandbox for the backend.
Mirrors Landlock intent on Win10 and Win11: deny ambient write access and
grant RW only under MeshChatX storage, Reticulum config, logs, and temp.
Unlike Landlock, policy is applied at CreateProcess time via a launcher.
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787ctypes
Tff7b72import T7ee787logging
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787dataclasses Tff7b72import Te6edf3dataclass
Tff7b72from T7ee787typing Tff7b72import Te6edf3Callable
Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.appcontainerTa5d6ff"Tb4b4b4)
Te6edf3APPCONTAINER_PROFILE_NAME Tff7b72= Ta5d6ff"Ta5d6ffMeshChatX.BackendTa5d6ff"
Te6edf3APPCONTAINER_DISPLAY_NAME Tff7b72= Ta5d6ff"Ta5d6ffMeshChatX BackendTa5d6ff"
Te6edf3CHILD_ENV_FLAG Tff7b72= Ta5d6ff"Ta5d6ffMESHCHAT_APPCONTAINER_CHILDTa5d6ff"
Te6edf3ENV_VAR Tff7b72= Ta5d6ff"Ta5d6ffMESHCHAT_APPCONTAINERTa5d6ff"
T8b949e# Dedicated exchange dirs under the user profile. Do not ACL-grant all of
T8b949e# Documents or Downloads. Attachments and exports use these subfolders only.
Te6edf3USER_EXCHANGE_DIR_NAME Tff7b72= Ta5d6ff"Ta5d6ffMeshChatXTa5d6ff"
T8b949e# Win32 constants
Te6edf3_ERROR_ALREADY_EXISTS Tff7b72= T79c0ff183
Te6edf3_ERROR_SUCCESS Tff7b72= T79c0ff0
Te6edf3_INVALID_HANDLE_VALUE Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tff7b72-T79c0ff1Tb4b4b4)Tff7b72.Td2a8ffvalue
Te6edf3_GENERIC_READ Tff7b72= T79c0ff0x80000000
Te6edf3_GENERIC_WRITE Tff7b72= T79c0ff0x40000000
Te6edf3_GENERIC_EXECUTE Tff7b72= T79c0ff0x20000000
Te6edf3_GENERIC_ALL Tff7b72= T79c0ff0x10000000
Te6edf3_FILE_GENERIC_READ Tff7b72= T79c0ff0x00120089
Te6edf3_FILE_GENERIC_WRITE Tff7b72= T79c0ff0x00120116
Te6edf3_FILE_GENERIC_EXECUTE Tff7b72= T79c0ff0x001200A0
Te6edf3_GRANT_ACCESS Tff7b72= T79c0ff1
Te6edf3_REVOKE_ACCESS Tff7b72= T79c0ff4
Te6edf3_TRUSTEE_IS_SID Tff7b72= T79c0ff0
Te6edf3_TRUSTEE_IS_UNKNOWN Tff7b72= T79c0ff0
Te6edf3_SUB_CONTAINERS_AND_OBJECTS_INHERIT Tff7b72= T79c0ff0x3
Te6edf3_SE_FILE_OBJECT Tff7b72= T79c0ff1
Te6edf3_DACL_SECURITY_INFORMATION Tff7b72= T79c0ff0x00000004
Te6edf3_PROTECTED_DACL_SECURITY_INFORMATION Tff7b72= T79c0ff0x80000000
Te6edf3_SE_GROUP_ENABLED Tff7b72= T79c0ff0x00000004
Te6edf3_CREATE_UNICODE_ENVIRONMENT Tff7b72= T79c0ff0x00000400
Te6edf3_EXTENDED_STARTUPINFO_PRESENT Tff7b72= T79c0ff0x00080000
Te6edf3_CREATE_NO_WINDOW Tff7b72= T79c0ff0x08000000
T8b949e# ProcThreadAttributeList numbers (Windows 8+)
Te6edf3_PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES Tff7b72= T79c0ff0x00020009
Te6edf3_PROC_THREAD_ATTRIBUTE_ALL_APPLICATION_PACKAGES_POLICY Tff7b72= T79c0ff0x0002000E
Te6edf3_PROCESS_CREATION_ALL_APPLICATION_PACKAGES_OPT_OUT Tff7b72= T79c0ff1
T8b949e# WELL_KNOWN_SID_TYPE for AppContainer network capabilities
Te6edf3_WinCapabilityInternetClientSid Tff7b72= T79c0ff85
Te6edf3_WinCapabilityInternetClientServerSid Tff7b72= T79c0ff86
Te6edf3_WinCapabilityPrivateNetworkClientServerSid Tff7b72= T79c0ff84
Te6edf3_INFINITE Tff7b72= T79c0ff0xFFFFFFFF
Te6edf3_WAIT_OBJECT_0 Tff7b72= T79c0ff0
Te6edf3_MITIGATION_POLICY_EXTENSION_POINT_DISABLE Tff7b72= T79c0ff6
Te6edf3_MITIGATION_POLICY_IMAGE_LOAD Tff7b72= T79c0ff10
Te6edf3_MITIGATION_POLICY_STRICT_HANDLE_CHECK Tff7b72= T79c0ff3
Tf0883e@dataclassTb4b4b4(Te6edf3frozenTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72class T56d364LaunchResultTb4b4b4:
T8b949e"""Outcome of launching a process into an AppContainer."""
Te6edf3okTb4b4b4: Tffa657bool
Te6edf3exit_codeTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Te6edf3errorTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Te6edf3used_appcontainerTb4b4b4: Tffa657bool Tff7b72= Tff7b72False
Te6edf3fell_backTb4b4b4: Tffa657bool Tff7b72= Tff7b72False
Tff7b72class T56d364_SID_AND_ATTRIBUTESTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffSidTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffAttributesTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_SECURITY_CAPABILITIESTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffAppContainerSidTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffCapabilitiesTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3_SID_AND_ATTRIBUTESTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffCapabilityCountTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffReservedTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_STARTUPINFOTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffcbTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6fflpReservedTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6fflpDesktopTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6fflpTitleTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwXTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwYTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwXSizeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwYSizeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwXCountCharsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwYCountCharsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwFillAttributeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwFlagsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffwShowWindowTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ushortTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffcbReserved2Ta5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ushortTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6fflpReserved2Ta5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffhStdInputTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffhStdOutputTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffhStdErrorTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_STARTUPINFOEXTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffStartupInfoTa5d6ff"Tb4b4b4, Te6edf3_STARTUPINFOTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6fflpAttributeListTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_PROCESS_INFORMATIONTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffhProcessTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffhThreadTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwProcessIdTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdwThreadIdTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_TRUSTEE_WTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffpMultipleTrusteeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffMultipleTrusteeOperationTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffTrusteeFormTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffTrusteeTypeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffptstrNameTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_EXPLICIT_ACCESS_WTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffgrfAccessPermissionsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffgrfAccessModeTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffgrfInheritanceTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffTrusteeTa5d6ff"Tb4b4b4, Te6edf3_TRUSTEE_WTb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICYTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[Tb4b4b4(Ta5d6ff"Ta5d6ffFlagsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4]
Tff7b72class T56d364_PROCESS_MITIGATION_IMAGE_LOAD_POLICYTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[Tb4b4b4(Ta5d6ff"Ta5d6ffFlagsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4]
Tff7b72class T56d364_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICYTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[Tb4b4b4(Ta5d6ff"Ta5d6ffFlagsTa5d6ff"Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4)Tb4b4b4]
Te6edf3_appcontainer_support_cachedTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72def Td2a8ff_env_overrideTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657bool Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3raw Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Te6edf3ENV_VARTb4b4b4)
Tff7b72if Te6edf3raw Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3val Tff7b72= Te6edf3rawTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3val Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fffalseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffoffTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3val Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffis_appcontainer_childTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Return True when this process was launched inside the AppContainer."""
Te6edf3raw Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Te6edf3CHILD_ENV_FLAGTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3rawTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_windows_version_supportedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3ver Tff7b72= Te6edf3sysTff7b72.Td2a8ffgetwindowsversionTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Tff7b72return Tff7b72False
T8b949e# AppContainer exists since Win8. LPAC and packaging we rely on need Win10+.
Tff7b72return Tffa657intTb4b4b4(Te6edf3verTff7b72.Td2a8ffmajorTb4b4b4) Tff7b72>Tff7b72= T79c0ff10
Tff7b72def Td2a8ff_probe_appcontainer_apisTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3userenv Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffuserenvTa5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3kernel32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3advapi32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffadvapi32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3required Tff7b72= Tb4b4b4(
Tffa657hasattrTb4b4b4(Te6edf3userenvTb4b4b4, Ta5d6ff"Ta5d6ffCreateAppContainerProfileTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3userenvTb4b4b4, Ta5d6ff"Ta5d6ffDeriveAppContainerSidFromAppContainerNameTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3userenvTb4b4b4, Ta5d6ff"Ta5d6ffDeleteAppContainerProfileTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3kernel32Tb4b4b4, Ta5d6ff"Ta5d6ffInitializeProcThreadAttributeListTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3kernel32Tb4b4b4, Ta5d6ff"Ta5d6ffUpdateProcThreadAttributeTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3kernel32Tb4b4b4, Ta5d6ff"Ta5d6ffDeleteProcThreadAttributeListTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3advapi32Tb4b4b4, Ta5d6ff"Ta5d6ffSetEntriesInAclWTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3advapi32Tb4b4b4, Ta5d6ff"Ta5d6ffGetNamedSecurityInfoWTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3advapi32Tb4b4b4, Ta5d6ff"Ta5d6ffSetNamedSecurityInfoWTa5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657hasattrTb4b4b4(Te6edf3advapi32Tb4b4b4, Ta5d6ff"Ta5d6ffCreateWellKnownSidTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Tffa657allTb4b4b4(Te6edf3requiredTb4b4b4)
Tff7b72def Td2a8ffappcontainer_supportedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72global Te6edf3_appcontainer_support_cached
Tff7b72if Te6edf3_appcontainer_support_cached Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_appcontainer_support_cached
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Te6edf3_appcontainer_support_cached Tff7b72= Tff7b72False
Tff7b72return Tff7b72False
Tff7b72if Tff7b72not Te6edf3_windows_version_supportedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3_appcontainer_support_cached Tff7b72= Tff7b72False
Tff7b72return Tff7b72False
Te6edf3_appcontainer_support_cached Tff7b72= Te6edf3_probe_appcontainer_apisTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_appcontainer_support_cached
Tff7b72def Td2a8ffappcontainer_requestedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3override Tff7b72= Te6edf3_env_overrideTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3override Tff7b72is Tff7b72FalseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3override Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffappcontainer_auto_enabledTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3appcontainer_requestedTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3_env_overrideTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8ffappcontainer_disabled_by_envTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3_env_overrideTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8ffappcontainer_forcedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3_env_overrideTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8ff_existing_dirTb4b4b4(Te6edf3pathTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3pathTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3resolved Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3resolvedTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3resolved
Te6edf3parent Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3resolvedTb4b4b4)
Tff7b72if Te6edf3parent Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3parentTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3parent
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_ensure_dirTb4b4b4(Te6edf3pathTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3pathTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3resolved Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3resolvedTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3resolvedTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3resolved
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_windows_known_folderTb4b4b4(Te6edf3folder_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Resolve a Windows Known Folder GUID to a path (handles OneDrive redirects)."""
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787ctypes Tff7b72import Te6edf3wintypes
Tff7b72class T56d364_GUIDTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Te6edf3_fields_ Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffData1Ta5d6ff"Tb4b4b4, Te6edf3wintypesTff7b72.Td2a8ffDWORDTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffData2Ta5d6ff"Tb4b4b4, Te6edf3wintypesTff7b72.Td2a8ffWORDTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffData3Ta5d6ff"Tb4b4b4, Te6edf3wintypesTff7b72.Td2a8ffWORDTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffData4Ta5d6ff"Tb4b4b4, Te6edf3wintypesTff7b72.Td2a8ffBYTE Tff7b72* T79c0ff8Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72def Td2a8ff_parse_guidTb4b4b4(Te6edf3valueTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Te6edf3_GUIDTb4b4b4:
Te6edf3hex_part Tff7b72= Te6edf3valueTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Tffd700{}Ta5d6ff"Tb4b4b4)
Te6edf3parts Tff7b72= Te6edf3hex_partTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4)
Te6edf3data4_hex Tff7b72= Te6edf3partsTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72+ Te6edf3partsTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3data4 Tff7b72= Tb4b4b4(Te6edf3wintypesTff7b72.Td2a8ffBYTE Tff7b72* T79c0ff8Tb4b4b4)Tb4b4b4(
Tff7b72*Tb4b4b4[Tffa657intTb4b4b4(Te6edf3data4_hexTb4b4b4[Te6edf3i Tb4b4b4: Te6edf3i Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4) Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff16Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4]
Tb4b4b4)
Tff7b72return Te6edf3_GUIDTb4b4b4(
Tffa657intTb4b4b4(Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4)Tb4b4b4,
Tffa657intTb4b4b4(Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4)Tb4b4b4,
Tffa657intTb4b4b4(Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4)Tb4b4b4,
Te6edf3data4Tb4b4b4,
Tb4b4b4)
Te6edf3shell32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffshell32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3ole32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffole32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3path_ptr Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Tb4b4b4)
Te6edf3fid Tff7b72= Te6edf3_parse_guidTb4b4b4(Te6edf3folder_idTb4b4b4)
T8b949e# KF_FLAG_DEFAULT = 0
Te6edf3hr Tff7b72= Te6edf3shell32Tff7b72.Td2a8ffSHGetKnownFolderPathTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3fidTb4b4b4)Tb4b4b4,
T79c0ff0Tb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3path_ptrTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3hr Tff7b72!= T79c0ff0 Tff7b72or Tff7b72not Te6edf3path_ptrTff7b72.Td2a8ffvalueTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3path_ptrTff7b72.Td2a8ffvalueTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3ole32Tff7b72.Td2a8ffCoTaskMemFreeTb4b4b4(Te6edf3path_ptrTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_user_profile_dirTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72for Te6edf3key Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffUSERPROFILETa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHOMETa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3raw Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72if Te6edf3rawTb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3rawTb4b4b4)
Te6edf3home Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3home Tff7b72and Te6edf3home Tff7b72!= Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3homeTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffcollect_user_exchange_rootsTb4b4b4(Tff7b72*Tb4b4b4, Te6edf3createTb4b4b4: Tffa657bool Tff7b72= Tff7b72TrueTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Return Documents/Downloads/Pictures MeshChatX subfolders for attachments.
Grants RW only under these app-owned exchange dirs, never the entire
Documents or Downloads tree.
"""
Te6edf3rootsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3profile Tff7b72= Te6edf3_user_profile_dirTb4b4b4(Tb4b4b4)
Te6edf3known Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdocumentsTa5d6ff"Tb4b4b4: Te6edf3_windows_known_folderTb4b4b4(Ta5d6ff"Ta5d6ff{Ta5d6ffFDD39AD0-238F-46AF-ADB4-6C85480369C7}Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdownloadsTa5d6ff"Tb4b4b4: Te6edf3_windows_known_folderTb4b4b4(Ta5d6ff"Ta5d6ff{Ta5d6ff374DE290-123F-4565-9164-39C4925E467B}Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpicturesTa5d6ff"Tb4b4b4: Te6edf3_windows_known_folderTb4b4b4(Ta5d6ff"Ta5d6ff{Ta5d6ff33E28130-4E1E-4676-835A-98395C3BC3BB}Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
T8b949e# Fallback when Known Folder APIs are unavailable (tests / non-Windows).
Tff7b72if Te6edf3profileTb4b4b4:
Tff7b72if Tff7b72not Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdocumentsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdocumentsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3profileTb4b4b4, Ta5d6ff"Ta5d6ffDocumentsTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdownloadsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdownloadsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3profileTb4b4b4, Ta5d6ff"Ta5d6ffDownloadsTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffpicturesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffpicturesTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3profileTb4b4b4, Ta5d6ff"Ta5d6ffPicturesTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3parent Tff7b72in Tb4b4b4(Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdocumentsTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffdownloadsTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3knownTb4b4b4[Ta5d6ff"Ta5d6ffpicturesTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3parentTb4b4b4:
Tff7b72continue
Te6edf3exchange Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3parentTb4b4b4, Te6edf3USER_EXCHANGE_DIR_NAMETb4b4b4)
Tff7b72if Te6edf3createTb4b4b4:
Te6edf3ensured Tff7b72= Te6edf3_ensure_dirTb4b4b4(Te6edf3exchangeTb4b4b4)
Tff7b72if Te6edf3ensured Tff7b72and Te6edf3ensured Tff7b72not Tff7b72in Te6edf3rootsTb4b4b4:
Te6edf3rootsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ensuredTb4b4b4)
Tff7b72continue
Te6edf3existing Tff7b72= Te6edf3_existing_dirTb4b4b4(Te6edf3exchangeTb4b4b4)
Tff7b72if Te6edf3existing Tff7b72and Te6edf3existing Tff7b72not Tff7b72in Te6edf3rootsTb4b4b4:
Te6edf3rootsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3existingTb4b4b4)
Tff7b72return Te6edf3roots
Tff7b72def Td2a8ffcollect_rw_rootsTb4b4b4(
Te6edf3storage_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3reticulum_config_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3log_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3exe_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Collect directories that need Package-SID write access."""
Te6edf3pathsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3candidate Tff7b72in Tb4b4b4(
Te6edf3storage_dirTb4b4b4,
Te6edf3reticulum_config_dirTb4b4b4,
Te6edf3log_dirTb4b4b4,
Te6edf3tempfileTff7b72.Td2a8ffgettempdirTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffTMPTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffTEMPTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffTMPDIRTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3existing Tff7b72= Te6edf3_existing_dirTb4b4b4(Te6edf3candidateTb4b4b4)
Tff7b72if Te6edf3existing Tff7b72and Te6edf3existing Tff7b72not Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3existingTb4b4b4)
T8b949e# Ensure parents exist for storage/config/log even before first write.
Tff7b72for Te6edf3candidate Tff7b72in Tb4b4b4(Te6edf3storage_dirTb4b4b4, Te6edf3reticulum_config_dirTb4b4b4, Te6edf3log_dirTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3candidateTb4b4b4:
Tff7b72continue
Te6edf3resolved Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3candidateTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3resolvedTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3resolved Tff7b72not Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3resolvedTb4b4b4)
Tff7b72for Te6edf3exchange Tff7b72in Te6edf3collect_user_exchange_rootsTb4b4b4(Te6edf3createTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3exchange Tff7b72not Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3exchangeTb4b4b4)
Tff7b72return Te6edf3paths
Tff7b72def Td2a8ffcollect_ro_rootsTb4b4b4(Tff7b72*Tb4b4b4, Te6edf3exe_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Collect directories that need Package-SID read/execute access under LPAC."""
Te6edf3pathsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3candidate Tff7b72in Tb4b4b4(
Te6edf3exe_dirTb4b4b4,
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3sysTff7b72.Td2a8ffexecutableTb4b4b4) Tff7b72if Te6edf3sysTff7b72.Td2a8ffexecutable Tff7b72else Tff7b72NoneTb4b4b4,
Tffa657getattrTb4b4b4(Te6edf3sysTb4b4b4, Ta5d6ff"Ta5d6ffprefixTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Tffa657getattrTb4b4b4(Te6edf3sysTb4b4b4, Ta5d6ff"Ta5d6ffbase_prefixTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3existing Tff7b72= Te6edf3_existing_dirTb4b4b4(Te6edf3candidateTb4b4b4)
Tff7b72if Te6edf3existing Tff7b72and Te6edf3existing Tff7b72not Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3existingTb4b4b4)
Tff7b72return Te6edf3paths
Tff7b72def Td2a8ff_as_void_pTb4b4b4(Te6edf3ptrTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_p Tff7b72| Tffa657int Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3ptrTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ptr
Tff7b72return Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Te6edf3ptrTb4b4b4)
Tff7b72def Td2a8ff_local_freeTb4b4b4(Te6edf3ptrTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_p Tff7b72| Tffa657int Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3ptrTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3ctypesTff7b72.Td2a8ffwindllTff7b72.Td2a8ffkernel32Tff7b72.Td2a8ffLocalFreeTb4b4b4(Te6edf3_as_void_pTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff_create_capability_sidTb4b4b4(Te6edf3well_knownTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3ctypesTff7b72.Td2a8ffc_void_p Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3advapi32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffadvapi32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3size Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3advapi32Tff7b72.Td2a8ffCreateWellKnownSidTb4b4b4(
Te6edf3well_knownTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3sizeTff7b72.Td2a8ffvalue Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3buf Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_ubyte Tff7b72* Te6edf3sizeTff7b72.Td2a8ffvalueTb4b4b4)Tb4b4b4(Tb4b4b4)
Te6edf3ok Tff7b72= Te6edf3advapi32Tff7b72.Td2a8ffCreateWellKnownSidTb4b4b4(
Te6edf3well_knownTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3okTb4b4b4:
Tff7b72return Tff7b72None
T8b949e# Keep buffer alive by attaching to a c_void_p holder via identity.
Te6edf3holder Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(Te6edf3bufTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)
Te6edf3holderTff7b72.Td2a8ff_sid_buffer Tff7b72= Te6edf3buf T8b949e# type: ignore[attr-defined]
Tff7b72return Te6edf3holder
Tff7b72def Td2a8ffensure_appcontainer_profileTb4b4b4(
Te6edf3profile_nameTb4b4b4: Tffa657str Tff7b72= Te6edf3APPCONTAINER_PROFILE_NAMETb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4:
T8b949e"""Create or derive the AppContainer package SID for profile_name."""
Te6edf3userenv Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffuserenvTa5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3sid Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
Te6edf3hr Tff7b72= Te6edf3userenvTff7b72.Td2a8ffCreateAppContainerProfileTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3profile_nameTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3profile_nameTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3APPCONTAINER_DISPLAY_NAMETb4b4b4)Tb4b4b4,
Tff7b72NoneTb4b4b4,
T79c0ff0Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sidTb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# HRESULT: S_OK (0) or HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)
Tff7b72if Te6edf3hr Tff7b72== T79c0ff0 Tff7b72and Te6edf3sidTff7b72.Td2a8ffvalueTb4b4b4:
Tff7b72return Te6edf3sid
T8b949e# Already exists or create returned SID unset: derive it.
Tff7b72if Te6edf3sidTff7b72.Td2a8ffvalueTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ctypesTff7b72.Td2a8ffwindllTff7b72.Td2a8ffkernel32Tff7b72.Td2a8ffLocalFreeTb4b4b4(Te6edf3sidTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Te6edf3sid Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
Te6edf3hr Tff7b72= Te6edf3userenvTff7b72.Td2a8ffDeriveAppContainerSidFromAppContainerNameTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3profile_nameTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sidTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3hr Tff7b72!= T79c0ff0 Tff7b72or Tff7b72not Te6edf3sidTff7b72.Td2a8ffvalueTb4b4b4:
Te6edf3err Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3errTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffDeriveAppContainerSidFromAppContainerName failed: hr=Tffd700{Te6edf3hrTffd700}Ta5d6ff err=Tffd700{Te6edf3errTffd700}Ta5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3sid
Tff7b72def Td2a8ffdelete_appcontainer_profileTb4b4b4(Te6edf3profile_nameTb4b4b4: Tffa657str Tff7b72= Te6edf3APPCONTAINER_PROFILE_NAMETb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3userenv Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffuserenvTa5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3hr Tff7b72= Te6edf3userenvTff7b72.Td2a8ffDeleteAppContainerProfileTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3profile_nameTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3hr Tff7b72not Tff7b72in Tb4b4b4(T79c0ff0Tb4b4b4,Tb4b4b4)Tb4b4b4:
T8b949e# Best effort cleanup. Profile may be in use.
Te6edf3loggerTff7b72.Td2a8ffdebugTb4b4b4(Ta5d6ff"Ta5d6ffDeleteAppContainerProfile hr=Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3hrTb4b4b4)
Tff7b72def Td2a8ff_set_path_accessTb4b4b4(
Te6edf3pathTb4b4b4: Tffa657strTb4b4b4, Te6edf3sidTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Te6edf3access_maskTb4b4b4: Tffa657intTb4b4b4, Te6edf3modeTb4b4b4: Tffa657int
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3advapi32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffadvapi32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3ea Tff7b72= Te6edf3_EXPLICIT_ACCESS_WTb4b4b4(Tb4b4b4)
Te6edf3eaTff7b72.Td2a8ffgrfAccessPermissions Tff7b72= Te6edf3access_mask
Te6edf3eaTff7b72.Td2a8ffgrfAccessMode Tff7b72= Te6edf3mode
Te6edf3eaTff7b72.Td2a8ffgrfInheritance Tff7b72= Te6edf3_SUB_CONTAINERS_AND_OBJECTS_INHERIT
Te6edf3eaTff7b72.Td2a8ffTrusteeTff7b72.Td2a8ffpMultipleTrustee Tff7b72= Tff7b72None
Te6edf3eaTff7b72.Td2a8ffTrusteeTff7b72.Td2a8ffMultipleTrusteeOperation Tff7b72= T79c0ff0
Te6edf3eaTff7b72.Td2a8ffTrusteeTff7b72.Td2a8ffTrusteeForm Tff7b72= Te6edf3_TRUSTEE_IS_SID
Te6edf3eaTff7b72.Td2a8ffTrusteeTff7b72.Td2a8ffTrusteeType Tff7b72= Te6edf3_TRUSTEE_IS_UNKNOWN
Te6edf3eaTff7b72.Td2a8ffTrusteeTff7b72.Td2a8ffptstrName Tff7b72= Te6edf3sid
T8b949e# Merge with the existing DACL so we do not wipe user or system ACEs.
Te6edf3p_sd Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
Te6edf3p_dacl Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
Te6edf3get_status Tff7b72= Te6edf3advapi32Tff7b72.Td2a8ffGetNamedSecurityInfoWTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4,
Te6edf3_SE_FILE_OBJECTTb4b4b4,
Te6edf3_DACL_SECURITY_INFORMATIONTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3p_daclTb4b4b4)Tb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3p_sdTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3get_status Tff7b72!= Te6edf3_ERROR_SUCCESSTb4b4b4:
Te6edf3err Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3errTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffGetNamedSecurityInfoW failed for Tffd700{Te6edf3pathTffd700}Ta5d6ff: status=Tffd700{Te6edf3get_statusTffd700}Ta5d6ff"
Tb4b4b4)
Te6edf3new_acl Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3status Tff7b72= Te6edf3advapi32Tff7b72.Td2a8ffSetEntriesInAclWTb4b4b4(
T79c0ff1Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3eaTb4b4b4)Tb4b4b4,
Te6edf3p_daclTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3new_aclTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3status Tff7b72!= Te6edf3_ERROR_SUCCESS Tff7b72or Tff7b72not Te6edf3new_aclTff7b72.Td2a8ffvalueTb4b4b4:
Te6edf3err Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3errTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffSetEntriesInAclW failed for Tffd700{Te6edf3pathTffd700}Ta5d6ff: status=Tffd700{Te6edf3statusTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3advapi32Tff7b72.Td2a8ffSetNamedSecurityInfoWTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4,
Te6edf3_SE_FILE_OBJECTTb4b4b4,
Te6edf3_DACL_SECURITY_INFORMATIONTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3new_aclTb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3result Tff7b72!= Te6edf3_ERROR_SUCCESSTb4b4b4:
Te6edf3err Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3errTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffSetNamedSecurityInfoW failed for Tffd700{Te6edf3pathTffd700}Ta5d6ff: result=Tffd700{Te6edf3resultTffd700}Ta5d6ff"
Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3_local_freeTb4b4b4(Te6edf3new_aclTff7b72.Td2a8ffvalueTb4b4b4)
Te6edf3_local_freeTb4b4b4(Te6edf3p_sdTff7b72.Td2a8ffvalueTb4b4b4)
Tff7b72def Td2a8ffgrant_path_accessTb4b4b4(Te6edf3sidTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3writeTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3writeTb4b4b4:
Te6edf3mask Tff7b72= Te6edf3_GENERIC_READ Tff7b72| Te6edf3_GENERIC_WRITE Tff7b72| Te6edf3_GENERIC_EXECUTE Tff7b72| Te6edf3_GENERIC_ALL
Tff7b72elseTb4b4b4:
Te6edf3mask Tff7b72= Te6edf3_GENERIC_READ Tff7b72| Te6edf3_GENERIC_EXECUTE
Te6edf3_set_path_accessTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3sidTb4b4b4, Te6edf3maskTb4b4b4, Te6edf3_GRANT_ACCESSTb4b4b4)
Tff7b72def Td2a8ffrevoke_path_accessTb4b4b4(Te6edf3sidTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3_set_path_accessTb4b4b4(
Te6edf3pathTb4b4b4,
Te6edf3sidTb4b4b4,
Te6edf3_GENERIC_READ Tff7b72| Te6edf3_GENERIC_WRITE Tff7b72| Te6edf3_GENERIC_EXECUTE Tff7b72| Te6edf3_GENERIC_ALLTb4b4b4,
Te6edf3_REVOKE_ACCESSTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffdebugTb4b4b4(Ta5d6ff"Ta5d6ffrevoke_path_access Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3pathTb4b4b4, Te6edf3excTb4b4b4)
Tff7b72def Td2a8ff_build_command_lineTb4b4b4(Te6edf3exeTb4b4b4: Tffa657strTb4b4b4, Te6edf3argsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3parts Tff7b72= Tb4b4b4[Te6edf3exeTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4]
Tff7b72def Td2a8ffquoteTb4b4b4(Te6edf3partTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72not Te6edf3partTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff"Ta5d6ff"Ta5d6ff'
Tff7b72if Tffa657anyTb4b4b4(Te6edf3ch Tff7b72in Te6edf3part Tff7b72for Te6edf3ch Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\tTa5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3escaped Tff7b72= Te6edf3partTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4, Ta5d6ff'Tffea00\\Ta5d6ff"Ta5d6ff'Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff"Tffd700{Te6edf3escapedTffd700}Ta5d6ff"Ta5d6ff'
Tff7b72return Te6edf3part
Tff7b72return Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3quoteTb4b4b4(Te6edf3pTb4b4b4) Tff7b72for Te6edf3p Tff7b72in Te6edf3partsTb4b4b4)
Tff7b72def Td2a8ff_wait_processTb4b4b4(Te6edf3handleTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3kernel32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3wait Tff7b72= Te6edf3kernel32Tff7b72.Td2a8ffWaitForSingleObjectTb4b4b4(Te6edf3handleTb4b4b4, Te6edf3_INFINITETb4b4b4)
Tff7b72if Te6edf3wait Tff7b72!= Te6edf3_WAIT_OBJECT_0Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffWaitForSingleObject failedTa5d6ff"Tb4b4b4)
Te6edf3code Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3kernel32Tff7b72.Td2a8ffGetExitCodeProcessTb4b4b4(Te6edf3handleTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3codeTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffGetExitCodeProcess failedTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657intTb4b4b4(Te6edf3codeTff7b72.Td2a8ffvalueTb4b4b4)
Tff7b72def Td2a8ffcreate_process_in_appcontainerTb4b4b4(
Te6edf3exeTb4b4b4: Tffa657strTb4b4b4,
Te6edf3argsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3envTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3use_lpacTb4b4b4: Tffa657bool Tff7b72= Tff7b72TrueTb4b4b4,
Te6edf3cwdTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
T8b949e"""Create a child process inside the MeshChatX AppContainer profile.
Returns (hProcess, hThread, pid). Caller must CloseHandle both handles.
"""
Te6edf3kernel32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3sid Tff7b72= Te6edf3ensure_appcontainer_profileTb4b4b4(Tb4b4b4)
Te6edf3capability_types Tff7b72= Tb4b4b4(
Te6edf3_WinCapabilityInternetClientSidTb4b4b4,
Te6edf3_WinCapabilityInternetClientServerSidTb4b4b4,
Te6edf3_WinCapabilityPrivateNetworkClientServerSidTb4b4b4,
Tb4b4b4)
Te6edf3capability_holdersTb4b4b4: Tffa657listTb4b4b4[Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3wk Tff7b72in Te6edf3capability_typesTb4b4b4:
Te6edf3cap Tff7b72= Te6edf3_create_capability_sidTb4b4b4(Te6edf3wkTb4b4b4)
Tff7b72if Te6edf3cap Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3capTff7b72.Td2a8ffvalueTb4b4b4:
Te6edf3capability_holdersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3capTb4b4b4)
Te6edf3caps_array Tff7b72= Tb4b4b4(Te6edf3_SID_AND_ATTRIBUTES Tff7b72* Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3capability_holdersTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3iTb4b4b4, Te6edf3holder Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3capability_holdersTb4b4b4)Tb4b4b4:
Te6edf3caps_arrayTb4b4b4[Te6edf3iTb4b4b4]Tff7b72.Td2a8ffSid Tff7b72= Te6edf3holder
Te6edf3caps_arrayTb4b4b4[Te6edf3iTb4b4b4]Tff7b72.Td2a8ffAttributes Tff7b72= Te6edf3_SE_GROUP_ENABLED
Te6edf3sec_caps Tff7b72= Te6edf3_SECURITY_CAPABILITIESTb4b4b4(Tb4b4b4)
Te6edf3sec_capsTff7b72.Td2a8ffAppContainerSid Tff7b72= Te6edf3sid
Tff7b72if Te6edf3capability_holdersTb4b4b4:
Te6edf3sec_capsTff7b72.Td2a8ffCapabilities Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(
Te6edf3caps_arrayTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3_SID_AND_ATTRIBUTESTb4b4b4)
Tb4b4b4)
Te6edf3sec_capsTff7b72.Td2a8ffCapabilityCount Tff7b72= Tffa657lenTb4b4b4(Te6edf3capability_holdersTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3sec_capsTff7b72.Td2a8ffCapabilities Tff7b72= Tff7b72None
Te6edf3sec_capsTff7b72.Td2a8ffCapabilityCount Tff7b72= T79c0ff0
Te6edf3sec_capsTff7b72.Td2a8ffReserved Tff7b72= T79c0ff0
Te6edf3attr_count Tff7b72= T79c0ff2 Tff7b72if Te6edf3use_lpac Tff7b72else T79c0ff1
Te6edf3size Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_size_tTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3kernel32Tff7b72.Td2a8ffInitializeProcThreadAttributeListTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3attr_countTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3sizeTff7b72.Td2a8ffvalue Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffInitializeProcThreadAttributeList size failedTa5d6ff"
Tb4b4b4)
Te6edf3attr_buf Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_ubyte Tff7b72* Te6edf3sizeTff7b72.Td2a8ffvalueTb4b4b4)Tb4b4b4(Tb4b4b4)
Te6edf3attr_list Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(Te6edf3attr_bufTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4)
Tff7b72if Tff7b72not Te6edf3kernel32Tff7b72.Td2a8ffInitializeProcThreadAttributeListTb4b4b4(
Te6edf3attr_listTb4b4b4, Te6edf3attr_countTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sizeTb4b4b4)
Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffInitializeProcThreadAttributeList failedTa5d6ff"
Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3kernel32Tff7b72.Td2a8ffUpdateProcThreadAttributeTb4b4b4(
Te6edf3attr_listTb4b4b4,
T79c0ff0Tb4b4b4,
Te6edf3_PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIESTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3sec_capsTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3sec_capsTb4b4b4)Tb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffUpdateProcThreadAttribute SECURITY_CAPABILITIES failedTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3lpac_policy Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_ulongTb4b4b4(Te6edf3_PROCESS_CREATION_ALL_APPLICATION_PACKAGES_OPT_OUTTb4b4b4)
Tff7b72if Te6edf3use_lpacTb4b4b4:
Tff7b72if Tff7b72not Te6edf3kernel32Tff7b72.Td2a8ffUpdateProcThreadAttributeTb4b4b4(
Te6edf3attr_listTb4b4b4,
T79c0ff0Tb4b4b4,
Te6edf3_PROC_THREAD_ATTRIBUTE_ALL_APPLICATION_PACKAGES_POLICYTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3lpac_policyTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3lpac_policyTb4b4b4)Tb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffUpdateProcThreadAttribute LPAC policy failedTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3siex Tff7b72= Te6edf3_STARTUPINFOEXTb4b4b4(Tb4b4b4)
Te6edf3siexTff7b72.Td2a8ffStartupInfoTff7b72.Td2a8ffcb Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3siexTb4b4b4)
Te6edf3siexTff7b72.Td2a8fflpAttributeList Tff7b72= Te6edf3attr_list
Te6edf3pi Tff7b72= Te6edf3_PROCESS_INFORMATIONTb4b4b4(Tb4b4b4)
Te6edf3cmdline Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcreate_unicode_bufferTb4b4b4(Te6edf3_build_command_lineTb4b4b4(Te6edf3exeTb4b4b4, Te6edf3argsTb4b4b4)Tb4b4b4)
Te6edf3child_env Tff7b72= Tffa657dictTb4b4b4(Te6edf3osTff7b72.Td2a8ffenviron Tff7b72if Te6edf3env Tff7b72is Tff7b72None Tff7b72else Te6edf3envTb4b4b4)
Te6edf3child_envTb4b4b4[Te6edf3CHILD_ENV_FLAGTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"
Te6edf3child_envTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_APPCONTAINER_LAUNCHERTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
T8b949e# Build environment block (null-separated, double-null terminated).
Te6edf3env_block Tff7b72= Ta5d6ff"Tffea00\0Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3kTffd700}Ta5d6ff=Tffd700{Te6edf3vTffd700}Ta5d6ff" Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3child_envTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\0Tffea00\0Ta5d6ff"
Te6edf3env_buf Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcreate_unicode_bufferTb4b4b4(Te6edf3env_blockTb4b4b4)
Te6edf3creation_flags Tff7b72= Tb4b4b4(
Te6edf3_EXTENDED_STARTUPINFO_PRESENT
Tff7b72| Te6edf3_CREATE_UNICODE_ENVIRONMENT
Tff7b72| Te6edf3_CREATE_NO_WINDOW
Tb4b4b4)
Te6edf3ok Tff7b72= Te6edf3kernel32Tff7b72.Td2a8ffCreateProcessWTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3exeTb4b4b4)Tb4b4b4,
Te6edf3cmdlineTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72TrueTb4b4b4,
Te6edf3creation_flagsTb4b4b4,
Te6edf3env_bufTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3cwdTb4b4b4) Tff7b72if Te6edf3cwd Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3siexTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3piTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3okTb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffCreateProcessW AppContainer failedTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3piTff7b72.Td2a8ffhProcessTb4b4b4, Te6edf3piTff7b72.Td2a8ffhThreadTb4b4b4, Tffa657intTb4b4b4(Te6edf3piTff7b72.Td2a8ffdwProcessIdTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3kernel32Tff7b72.Td2a8ffDeleteProcThreadAttributeListTb4b4b4(Te6edf3attr_listTb4b4b4)
T8b949e# Free derived package SID after CreateProcess has copied capabilities.
Tff7b72tryTb4b4b4:
Te6edf3ctypesTff7b72.Td2a8ffwindllTff7b72.Td2a8ffkernel32Tff7b72.Td2a8ffLocalFreeTb4b4b4(Te6edf3sidTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffcreate_process_unsandboxedTb4b4b4(
Te6edf3exeTb4b4b4: Tffa657strTb4b4b4,
Te6edf3argsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3envTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3cwdTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffc_void_pTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
T8b949e"""Create a normal child process (auto-fallback path)."""
Te6edf3kernel32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3si Tff7b72= Te6edf3_STARTUPINFOTb4b4b4(Tb4b4b4)
Te6edf3siTff7b72.Td2a8ffcb Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3siTb4b4b4)
Te6edf3pi Tff7b72= Te6edf3_PROCESS_INFORMATIONTb4b4b4(Tb4b4b4)
Te6edf3cmdline Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcreate_unicode_bufferTb4b4b4(Te6edf3_build_command_lineTb4b4b4(Te6edf3exeTb4b4b4, Te6edf3argsTb4b4b4)Tb4b4b4)
Te6edf3child_env Tff7b72= Tffa657dictTb4b4b4(Te6edf3osTff7b72.Td2a8ffenviron Tff7b72if Te6edf3env Tff7b72is Tff7b72None Tff7b72else Te6edf3envTb4b4b4)
Te6edf3child_envTff7b72.Td2a8ffpopTb4b4b4(Te6edf3CHILD_ENV_FLAGTb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3child_envTff7b72.Td2a8ffpopTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_APPCONTAINER_LAUNCHERTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3env_block Tff7b72= Ta5d6ff"Tffea00\0Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3kTffd700}Ta5d6ff=Tffd700{Te6edf3vTffd700}Ta5d6ff" Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3child_envTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\0Tffea00\0Ta5d6ff"
Te6edf3env_buf Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcreate_unicode_bufferTb4b4b4(Te6edf3env_blockTb4b4b4)
Te6edf3ok Tff7b72= Te6edf3kernel32Tff7b72.Td2a8ffCreateProcessWTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3exeTb4b4b4)Tb4b4b4,
Te6edf3cmdlineTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72NoneTb4b4b4,
Tff7b72TrueTb4b4b4,
Te6edf3_CREATE_UNICODE_ENVIRONMENT Tff7b72| Te6edf3_CREATE_NO_WINDOWTb4b4b4,
Te6edf3env_bufTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffc_wchar_pTb4b4b4(Te6edf3cwdTb4b4b4) Tff7b72if Te6edf3cwd Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3siTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3piTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3okTb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffCreateProcessW unsandboxed failedTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3piTff7b72.Td2a8ffhProcessTb4b4b4, Te6edf3piTff7b72.Td2a8ffhThreadTb4b4b4, Tffa657intTb4b4b4(Te6edf3piTff7b72.Td2a8ffdwProcessIdTb4b4b4)
Tff7b72def Td2a8ffclose_handleTb4b4b4(Te6edf3handleTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_p Tff7b72| Tffa657int Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3handleTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffCloseHandleTb4b4b4(Te6edf3_as_void_pTb4b4b4(Te6edf3handleTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8fflaunch_backend_sandboxedTb4b4b4(
Te6edf3exeTb4b4b4: Tffa657strTb4b4b4,
Te6edf3argsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3storage_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3reticulum_config_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3log_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3forcedTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3use_lpacTb4b4b4: Tffa657bool Tff7b72= Tff7b72TrueTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3LaunchResultTb4b4b4:
T8b949e"""Grant ACLs, launch into AppContainer, wait, revoke ACLs.
Auto mode (forced=False): on AppContainer failure, fall back to unsandboxed.
Forced mode: return error without fallback.
"""
Tff7b72if Te6edf3forced Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3forced Tff7b72= Te6edf3appcontainer_forcedTb4b4b4(Tb4b4b4)
Te6edf3rw_roots Tff7b72= Te6edf3collect_rw_rootsTb4b4b4(Te6edf3storage_dirTb4b4b4, Te6edf3reticulum_config_dirTb4b4b4, Te6edf3log_dirTb4b4b4)
Te6edf3ro_roots Tff7b72= Te6edf3collect_ro_rootsTb4b4b4(Te6edf3exe_dirTff7b72=Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3exeTb4b4b4) Tff7b72if Te6edf3exe Tff7b72else Tff7b72NoneTb4b4b4)
Te6edf3sidTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffc_void_p Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Te6edf3grantedTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657boolTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3sid Tff7b72= Te6edf3ensure_appcontainer_profileTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3path Tff7b72in Te6edf3rw_rootsTb4b4b4:
Te6edf3grant_path_accessTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3writeTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3grantedTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3pathTb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3path Tff7b72in Te6edf3ro_rootsTb4b4b4:
Tff7b72if Te6edf3path Tff7b72in Te6edf3rw_rootsTb4b4b4:
Tff7b72continue
Te6edf3grant_path_accessTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3writeTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3grantedTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3pathTb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3h_processTb4b4b4, Te6edf3h_threadTb4b4b4, Te6edf3_pid Tff7b72= Te6edf3create_process_in_appcontainerTb4b4b4(
Te6edf3exeTb4b4b4,
Te6edf3argsTb4b4b4,
Te6edf3use_lpacTff7b72=Te6edf3use_lpacTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3close_handleTb4b4b4(Te6edf3h_threadTb4b4b4)
Te6edf3exit_code Tff7b72= Te6edf3_wait_processTb4b4b4(Te6edf3h_processTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3close_handleTb4b4b4(Te6edf3h_processTb4b4b4)
Tff7b72return Te6edf3LaunchResultTb4b4b4(
Te6edf3okTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3exit_codeTff7b72=Te6edf3exit_codeTb4b4b4,
Te6edf3used_appcontainerTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3fell_backTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffAppContainer launch failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3excTb4b4b4)
Tff7b72if Te6edf3forcedTb4b4b4:
Tff7b72return Te6edf3LaunchResultTb4b4b4(
Te6edf3okTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4,
Te6edf3used_appcontainerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3fell_backTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3loggerTff7b72.Td2a8ffwarningTb4b4b4(Ta5d6ff"Ta5d6ffFalling back to unsandboxed backend launchTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3h_processTb4b4b4, Te6edf3h_threadTb4b4b4, Te6edf3_pid Tff7b72= Te6edf3create_process_unsandboxedTb4b4b4(Te6edf3exeTb4b4b4, Te6edf3argsTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3close_handleTb4b4b4(Te6edf3h_threadTb4b4b4)
Te6edf3exit_code Tff7b72= Te6edf3_wait_processTb4b4b4(Te6edf3h_processTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3close_handleTb4b4b4(Te6edf3h_processTb4b4b4)
Tff7b72return Te6edf3LaunchResultTb4b4b4(
Te6edf3okTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3exit_codeTff7b72=Te6edf3exit_codeTb4b4b4,
Te6edf3used_appcontainerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3fell_backTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3fallback_excTb4b4b4:
Tff7b72return Te6edf3LaunchResultTb4b4b4(
Te6edf3okTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3fallback_excTb4b4b4)Tb4b4b4,
Te6edf3used_appcontainerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3fell_backTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72if Te6edf3sid Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3pathTb4b4b4, Te6edf3_write Tff7b72in Tffa657reversedTb4b4b4(Te6edf3grantedTb4b4b4)Tb4b4b4:
Te6edf3revoke_path_accessTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Te6edf3ctypesTff7b72.Td2a8ffwindllTff7b72.Td2a8ffkernel32Tff7b72.Td2a8ffLocalFreeTb4b4b4(Te6edf3sidTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffapply_windows_process_mitigationsTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Apply compatible process mitigations inside the sandboxed child.
Does not enable NoChildProcessCreation because bots, rnsh, and rnx still
re-enter via --meshchatx-run-module.
"""
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72!= Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Tff7b72not Te6edf3is_appcontainer_childTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3kernel32 Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffWinDLLTb4b4b4(Ta5d6ff"Ta5d6ffkernel32Ta5d6ff"Tb4b4b4, Te6edf3use_last_errorTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3kernel32Tb4b4b4, Ta5d6ff"Ta5d6ffSetProcessMitigationPolicyTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3applied Tff7b72= Tff7b72False
T8b949e# DisableExtensionPoints = 1
Te6edf3ext Tff7b72= Te6edf3_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICYTb4b4b4(Tb4b4b4)
Te6edf3extTff7b72.Td2a8ffFlags Tff7b72= T79c0ff0x1
Tff7b72if Te6edf3kernel32Tff7b72.Td2a8ffSetProcessMitigationPolicyTb4b4b4(
Te6edf3_MITIGATION_POLICY_EXTENSION_POINT_DISABLETb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3applied Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffdebugTb4b4b4(
Ta5d6ff"Ta5d6ffSetProcessMitigationPolicy extension-point failed: Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# PreferSystem32Images = 1 (bit 2), NoRemoteImages = 1 (bit 0) when compatible
Te6edf3img Tff7b72= Te6edf3_PROCESS_MITIGATION_IMAGE_LOAD_POLICYTb4b4b4(Tb4b4b4)
Te6edf3imgTff7b72.Td2a8ffFlags Tff7b72= T79c0ff0x1 Tff7b72| T79c0ff0x4
Tff7b72if Te6edf3kernel32Tff7b72.Td2a8ffSetProcessMitigationPolicyTb4b4b4(
Te6edf3_MITIGATION_POLICY_IMAGE_LOADTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3applied Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffdebugTb4b4b4(
Ta5d6ff"Ta5d6ffSetProcessMitigationPolicy image-load failed: Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# RaiseExceptionOnInvalidHandleReference | HandleExceptionsPermanently
Te6edf3strict Tff7b72= Te6edf3_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICYTb4b4b4(Tb4b4b4)
Te6edf3strictTff7b72.Td2a8ffFlags Tff7b72= T79c0ff0x1 Tff7b72| T79c0ff0x2
Tff7b72if Te6edf3kernel32Tff7b72.Td2a8ffSetProcessMitigationPolicyTb4b4b4(
Te6edf3_MITIGATION_POLICY_STRICT_HANDLE_CHECKTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffbyrefTb4b4b4(Te6edf3strictTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffsizeofTb4b4b4(Te6edf3strictTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3applied Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffdebugTb4b4b4(
Ta5d6ff"Ta5d6ffSetProcessMitigationPolicy strict-handle failed: Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffget_last_errorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3appliedTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffWindows process mitigations applied under AppContainerTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3applied
T8b949e# Hook type for tests that inject fake launchers.
Te6edf3LaunchBackendFn Tff7b72= Te6edf3CallableTb4b4b4[Tff7b72.Tff7b72.Tff7b72.Tb4b4b4, Te6edf3LaunchResultTb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────